/**
 * 防抖函数
 * @param {Function} fn 传入函数
 * @param {Number} delay 延迟时间
 */
export function debounce(fn, delay){
    let timer;
    return function(){
        //保存当前环境上下文
        let context = this;
        //保存参数
        let args = arguments;
        //清除上一个
        clearTimeout(timer);
        //设置下一个
        timer = setTimeout(function(){
            fn.apply(context, args);
        }, delay);
    }
}


/**
 * 带有立即执行的防抖函数
 * @param {Function} fn 传入函数
 * @param {Number} delay 延迟时间
 * @param {Boolean} immediate 是否立即执行
 */
export function debounced(fn, delay, immediate){
    let res, timer, context, args;

    return function(){
        context = this;
        args = arguments;
        //清除上一个
        if(timer) clearTimeout(timer);
        //判断是否执行
        if(immediate){
            //根据timer是否存在判断是否需要第一次立即执行
            let runNow = !timer;
            //设置下一次时间后的timer为null
            timer = setTimeout(() => {
                timer = null;
            }, delay);
            //根据前面判断的结果执行函数
            if(runNow){
                fn.apply(context, args);
            } 
        }
        else{
            //如果没有设置立即执行，则设置一个定时器
            timer = setTimeout(() => {
                fn.apply(context, args);
            }, delay);
        }
    }
}

/**
 * 节流函数
 * @param {Function} fn 传入函数
 * @param {Number} delay 延迟时间
 */
export function throttle(fn, delay){
    let timer, context, args;
    return function(){
        context = this;
        args = arguments;
        if(!timer){
            timer = setTimeout(() => {
                timer = null;
                fn.apply(context, args);
            }, delay);
        }
    }
}